﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using CamadaDeDados;
using CamadaDeNegocios.Models;

using MySql.Data.MySqlClient;
using System.Data;

namespace CamadaDeNegocios.Controllers
{
    public class PessoaFisicaController
    {
        /// <summary>
        /// Método para inserir uma nova pessoa Fisica
        /// </summary>
        /// <param name="pPessoa">Pessoa a ser inserida</param>
        /// <returns>Retorna verdadeiro se o processo for efetuado corretamente</returns>
        public static bool Inserir(PessoaFisica pPessoa)
        {
            Conexao _conexao = new Conexao("pessoa_fisica");

            try
            {
                _conexao.AdicionarParametro("Nome", pPessoa.Nome);
                _conexao.AdicionarParametro("Sobrenome", pPessoa.Sobrenome);
                _conexao.AdicionarParametro("CPF", pPessoa.CPF);
                _conexao.AdicionarParametro("RG", pPessoa.RG);
                _conexao.AdicionarParametro("DataNascimento", pPessoa.DataNascimento);
                _conexao.AdicionarParametro("Telefone", pPessoa.Telefone);
                _conexao.AdicionarParametro("Celular", pPessoa.Celular);
                _conexao.AdicionarParametro("HomePage", pPessoa.HomePage);
                _conexao.AdicionarParametro("Email", pPessoa.Email);

                _conexao.IniciarTransacao();

                _conexao.ExecutarComando(ComandosBanco.Insere);

                _conexao.Commit();
                return true;
            }
            catch (Exception ex)
            {
                _conexao.RollBack();

                throw ex;
            }
        }

        /// <summary>
        /// Método para alterar uma os dados de uma pessoa Fisica
        /// </summary>
        /// <param name="pPessoa">pessoa a ser atualizada</param>
        /// <returns>Retorna verdadeiro se o processo for efetuado corretamente</returns>
        public static bool Alterar(PessoaFisica pPessoa)
        {
            Conexao _conexao = new Conexao("pessoa_fisica");
            try
            {
                _conexao.AdicionarParametro("IdPessoa", pPessoa.IdPessoa);
                _conexao.AdicionarParametro("Nome", pPessoa.Nome);
                _conexao.AdicionarParametro("Sobrenome", pPessoa.Sobrenome);
                _conexao.AdicionarParametro("CPF", pPessoa.CPF);
                _conexao.AdicionarParametro("RG", pPessoa.RG);
                _conexao.AdicionarParametro("DataNascimento", pPessoa.DataNascimento);
                _conexao.AdicionarParametro("Telefone", pPessoa.Telefone);
                _conexao.AdicionarParametro("Celular", pPessoa.Celular);
                _conexao.AdicionarParametro("HomePage", pPessoa.HomePage);
                _conexao.AdicionarParametro("Email", pPessoa.Email);
                _conexao.AdicionarParametro("Situacao", pPessoa.Situacao.ToString());
                
                _conexao.IniciarTransacao();

                _conexao.ExecutarComando(ComandosBanco.Altera);

                _conexao.Commit();

                return true;
            }
            catch (Exception ex)
            {
                _conexao.RollBack();
                throw ex;
            }
        }

        /// <summary>
        /// Método para buscar a pessoa Fisica pelo código
        /// </summary>
        /// <param name="IdPessoa">código a ser pesquisado</param>
        /// <returns>Retorna um objeto pessoaFisica</returns>
        public static PessoaFisica BuscarPorId(int IdPessoa)
        {
            Conexao _conexao = new Conexao(Conexao.Conectar(), "pessoa_fisica");

            _conexao.AdicionarParametro("IdPessoa", IdPessoa);

            try
            {
                DataTable _leitor = _conexao.RetornarDataTable(ComandosBanco.BuscaPorID);
                //MySqlDataReader _leitor = _conexao.RetornarDataReader(ComandosBanco.BuscaPorID);

                if (_leitor.Rows.Count > 0)
                {
                    PessoaFisica _pessoa = new PessoaFisica(_leitor.Rows[0]);
                    return _pessoa;
                }
                else
                    throw new Exception("Pessoa não encontrada!");
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Retorna a lista de pessoas Fisicas
        /// </summary>
        /// <returns></returns>
        public static List<PessoaFisica> Lista()
        {
            Conexao _conexao = new Conexao("pessoa_fisica");

            MySqlDataReader _leitor = _conexao.RetornarDataReader(ComandosBanco.Lista);

            List<PessoaFisica> _listaPessoas = new List<PessoaFisica>();

            while (_leitor.Read())
            {
                _listaPessoas.Add(new PessoaFisica(_leitor));
            }

            return _listaPessoas;
        }
    }
}
